package com.are.odisea;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class GestionBandeja {
	private Bandeja bandeja;
	private BandejaReporte ordenbandeja;
	
	public static final int COMMIT_ON = 1;
	public static final int COMMIT_OFF = 0;
	
	public static final int ORDEN_MANTENIMIENTO = 2;
	public static final int ORDEN_INSTALACION = 1;
	
	public Bandeja getBandeja() {
		return bandeja;
	}
	public void setBandeja(Bandeja bandeja) {
		this.bandeja = bandeja;
	}

	public BandejaReporte getOrdenbandeja() {
		return ordenbandeja;
	}
	public void setOrdenbandeja(BandejaReporte ordenbandeja) {
		this.ordenbandeja = ordenbandeja;
	}

	private db conexion = null;
	
	public GestionBandeja(db conexion, Bandeja bandeja) {
		super();
		this.conexion = conexion;
		this.bandeja = bandeja;
	}
	public GestionBandeja(db conexion) {
		super();
		this.conexion = conexion;
	}
	
	public boolean Add() throws SQLException {
		boolean result = false;
		String sql ="insert into bandejas (bandnomb,bandesta,bandtipo,bandfesi,banduser,bandhoin,bandhofi) values (?,?,?,sysdate(),?,?,?)";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, bandeja.getNombre());
		pst.setInt(2, bandeja.getEstado());
		pst.setInt(3, bandeja.getTipo());
		pst.setString(4, bandeja.getUsuario());
		pst.setString(5, bandeja.getHora_inicial());
		pst.setString(6, bandeja.getHora_final());
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		return result;
	}
	
	public boolean Update(String id) throws SQLException {
		boolean result = false;
		String sql ="update bandejas set bandnomb=?,bandesta=?,bandtipo=?,bandhoin=?,bandhofi=? where id = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, bandeja.getNombre());
		pst.setInt(2, bandeja.getEstado());
		pst.setInt(3, bandeja.getTipo());
		pst.setString(4, bandeja.getHora_inicial());
		pst.setString(5, bandeja.getHora_final());
		pst.setString(6, id);
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		return result;
	}
	
	public boolean Remove(String id) throws SQLException {
		boolean result = false;
		String sql ="delete from bandejas where id = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		return result;
	}
	
	public boolean exist(String id ) throws SQLException {
		boolean result = false;
		String sql ="select id from bandejas where id=?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			result = true;
		}
		
		return result;
	}
	
	public ArrayList<Bandeja> List () throws SQLException {
		ArrayList<Bandeja> lista = new ArrayList<Bandeja>();
		String sql ="select * from bandejas order by bandnomb";
		ResultSet rs = conexion.Query(sql);
		while(rs.next()) {
			Bandeja bandeja = new Bandeja();
			bandeja.setId(rs.getInt("id"));
			bandeja.setNombre(rs.getString("bandnomb"));
			bandeja.setEstado(rs.getInt("bandesta"));
			bandeja.setTipo(rs.getInt("bandtipo"));
			bandeja.setFecha(rs.getString("bandfesi"));
			bandeja.setUsuario(rs.getString("banduser"));
			bandeja.setHora_inicial(rs.getString("bandhoin"));
			bandeja.setHora_final(rs.getString("bandhofi"));
			lista.add(bandeja);
		}
		
		return lista;
	}
	
	public ArrayList<Bandeja> List (int tipo) throws SQLException {
		ArrayList<Bandeja> lista = new ArrayList<Bandeja>();
		String sql ="select * from bandejas where bandtipo=? order by bandnomb";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, tipo);
		ResultSet rs = conexion.Query(pst);
		while(rs.next()) {
			Bandeja bandeja = new Bandeja();
			bandeja.setId(rs.getInt("id"));
			bandeja.setNombre(rs.getString("bandnomb"));
			bandeja.setEstado(rs.getInt("bandesta"));
			bandeja.setTipo(rs.getInt("bandtipo"));
			bandeja.setFecha(rs.getString("bandfesi"));
			bandeja.setUsuario(rs.getString("banduser"));
			bandeja.setHora_inicial(rs.getString("bandhoin"));
			bandeja.setHora_final(rs.getString("bandhofi"));
			lista.add(bandeja);
		}
		
		return lista;
	}
	
	public ArrayList<Bandeja> ListBandejasActivas (int tipo) throws SQLException {
		ArrayList<Bandeja> lista = new ArrayList<Bandeja>();
		String sql ="select * from bandejas where bandtipo=? and bandesta = 1 order by bandnomb";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, tipo);
		ResultSet rs = conexion.Query(pst);
		while(rs.next()) {
			Bandeja bandeja = new Bandeja();
			bandeja.setId(rs.getInt("id"));
			bandeja.setNombre(rs.getString("bandnomb"));
			bandeja.setEstado(rs.getInt("bandesta"));
			bandeja.setTipo(rs.getInt("bandtipo"));
			bandeja.setFecha(rs.getString("bandfesi"));
			bandeja.setUsuario(rs.getString("banduser"));
			bandeja.setHora_inicial(rs.getString("bandhoin"));
			bandeja.setHora_final(rs.getString("bandhofi"));
			lista.add(bandeja);
		}
		
		return lista;
	}
	public ArrayList<Bandeja> ListBandejasActivas (int tipo, String departamento) throws SQLException {
		ArrayList<Bandeja> lista = new ArrayList<Bandeja>();
		String sql ="select bandejas.* from bandejas where bandtipo=? and bandesta = 1 and bandejas.id in (select bandeja from bandeja_departamento where departamento =? ) order by bandnomb";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, tipo);
		pst.setString(2, departamento);
		
		ResultSet rs = conexion.Query(pst);
		while(rs.next()) {
			Bandeja bandeja = new Bandeja();
			bandeja.setId(rs.getInt("id"));
			bandeja.setNombre(rs.getString("bandnomb"));
			bandeja.setEstado(rs.getInt("bandesta"));
			bandeja.setTipo(rs.getInt("bandtipo"));
			bandeja.setFecha(rs.getString("bandfesi"));
			bandeja.setUsuario(rs.getString("banduser"));
			bandeja.setHora_inicial(rs.getString("bandhoin"));
			bandeja.setHora_final(rs.getString("bandhofi"));
			lista.add(bandeja);
		}
		
		return lista;
	}
	
	public boolean Find(String id) throws SQLException {
		boolean result = false;
		String sql ="select * from bandejas where id=?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			bandeja = new Bandeja();
			bandeja.setId(rs.getInt("id"));
			bandeja.setNombre(rs.getString("bandnomb"));
			bandeja.setEstado(rs.getInt("bandesta"));
			bandeja.setTipo(rs.getInt("bandtipo"));
			bandeja.setFecha(rs.getString("bandfesi"));
			bandeja.setUsuario(rs.getString("banduser"));
			bandeja.setHora_inicial(rs.getString("bandhoin"));
			bandeja.setHora_final(rs.getString("bandhofi"));
			result = true;
		}
		
		return result;
	}
	
	public boolean AsignarUsuario(String id, String usuario) throws SQLException {
		boolean result = false;
		
		if (!existUser(id,usuario)) {
			String sql ="insert into bandeja_usuario (bandeja,usuario) values (?,?)";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, id);
			pst.setString(2, usuario);
			if (conexion.Update(pst) > 0 ) {
				conexion.Commit();
				result = true;
			}
			
		}else {
			throw new SQLException("Usuario ya esta asignado a la bandeja");
		}
		
		
		return result;
	}
	
	public boolean removeUsuario(String id) throws SQLException {
		boolean result = false;

			String sql ="delete from bandeja_usuario where id=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, id);
			if (conexion.Update(pst) > 0 ) {
				conexion.Commit();
				result = true;
			}
		return result;
	}
	
	public ArrayList<BandejaUsuario> listUsuarios(String id) throws SQLException {
		ArrayList<BandejaUsuario> lista = new ArrayList<BandejaUsuario>();
		String sql ="select * from bandeja_usuario where bandeja=? order by usuario";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rs = conexion.Query(pst);
		while(rs.next()) {
			BandejaUsuario bu = new BandejaUsuario();
			bu.setId(rs.getInt("id"));
			bu.setBandeja(rs.getInt("bandeja"));
			bu.setUsuario(rs.getString("usuario"));
			lista.add(bu);
		}
		
		return lista;

	}
	
	public boolean existUser(String id,String usuario) throws SQLException {
		boolean result = false;
		String sql ="select id from bandeja_usuario where bandeja=? and usuario =?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		pst.setString(2, usuario);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			result = true;
		}
		rs.close();
		return result;
	}
	
	public boolean AsignarDepartamento(String id, String departamento) throws SQLException {
		boolean result = false;
		if (!existDepartamento(id,departamento)) {
			String sql ="insert into bandeja_departamento (bandeja,departamento) values (?,?)";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, id);
			pst.setString(2, departamento);
			if (conexion.Update(pst) > 0 ) {
				conexion.Commit();
				result = true;
			}
			
		}else {
			throw new SQLException("Departamento ya esta asignado a la bandeja");
		}
		
		
		return result;
	}
	
	public boolean removeDepartamento(String id) throws SQLException {
		boolean result = false;

			String sql ="delete from bandeja_departamento where id=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, id);
			if (conexion.Update(pst) > 0 ) {
				conexion.Commit();
				result = true;
			}
		return result;
	}
	
	public ArrayList<BandejaDepartamento> listDepartamento(String id) throws SQLException {
		ArrayList<BandejaDepartamento> lista = new ArrayList<BandejaDepartamento>();
		String sql ="select id, bandeja,departamento,depadesc from bandeja_departamento,departamentos where bandeja=? and departamento=depacodi order by depadesc";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rs = conexion.Query(pst);
		while(rs.next()) {
			BandejaDepartamento bd = new BandejaDepartamento();
			bd.setId(rs.getInt("id"));
			bd.setBandeja(rs.getInt("bandeja"));
			bd.setDepartamento(rs.getString("departamento"));
			bd.setNombreDepartamento(rs.getString("depadesc"));
			lista.add(bd);
		}
		
		return lista;

	}
	
	public boolean existDepartamento(String id,String departamento) throws SQLException {
		boolean result = false;
		String sql ="select id from bandeja_departamento where bandeja=? and departamento =?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, id);
		pst.setString(2, departamento);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			result = true;
		}
		rs.close();
		return result;
	}
	
	public boolean AddReporte(BandejaReporte r,int commit) throws SQLException {
		boolean result = false;
		String sql = "insert into bandeja_reporte (orden,tipo_orden,fecha_reporte,usuario_reporte,personal_reporte,bandeja) " +
				" values (?,?,sysdate(),?,?,?)";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, r.getOrden());
		pst.setInt(2, r.getTipo_orden());
		pst.setString(3, r.getUsuario_reporte());
		pst.setString(4, r.getPersonal_reporte());
		pst.setInt(5, r.getBandeja());
		
		if (conexion.Update(pst)>0) {
			if (commit == COMMIT_ON) {
				conexion.Commit();
			}
			result = true;
		}
		
		return result;
	}
	
	public int BandejaLibre( int tipo, String departamento) throws SQLException {
		int id = -1;
		String sql = "SELECT bandejas.id, COUNT(`bandeja_reporte`.`orden`) as total " +
					"FROM bandejas " + 
					"LEFT OUTER JOIN bandeja_reporte ON bandejas.id = bandeja_reporte.bandeja" +
					" WHERE bandejas.id IN (select bandeja from bandeja_departamento where departamento = ?) " +
					" AND bandejas.bandtipo = ?" +
					" AND HOUR(SYSDATE()) BETWEEN bandejas.bandhoin AND bandejas.bandhofi AND  bandesta = 1" +
					" GROUP BY bandejas.id  " +
					" ORDER BY TOTAL";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, departamento);
		pst.setInt(2, tipo);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			id = rs.getInt("id");
		}
		
		return id;
	}
	
	public ArrayList<Bandeja> BandejasUsuario(String usuario) throws SQLException {
		ArrayList<Bandeja> lista = new ArrayList<Bandeja>();
		String sql = "select bandejas.id,bandejas.bandnomb, bandejas.bandtipo,bandejas.bandesta " +
				"from bandejas " +
				"where id IN(select bandeja from bandeja_usuario where usuario=?) " +
				"order by bandnomb";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, usuario);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			Bandeja bandeja = new Bandeja();
			bandeja.setId(rs.getInt("id"));
			bandeja.setNombre(rs.getString("bandnomb"));
			bandeja.setTipo(rs.getInt("bandtipo"));
			bandeja.setEstado(rs.getInt("bandesta"));
			lista.add(bandeja);
		}
		
		return lista;
	}
	
	public ArrayList<OrdenBandeja> OrdenesBandeja(int bandeja) throws SQLException {
		
		Bandeja b = new Bandeja();
		GestionBandeja GB = new GestionBandeja(conexion);
		if (GB.Find(Integer.toString(bandeja))) {
			b = GB.getBandeja();
		}else {
			throw new SQLException("Bandeja no encontrada ID=" + bandeja);
		}
		
		
		
		ArrayList<OrdenBandeja> lista = new ArrayList<OrdenBandeja>();
		
		if (b.getTipo() == GestionBandeja.ORDEN_MANTENIMIENTO) { // orden de mantenimiento
		
			String sql = "select odsst.ODSNATIS, odsst.ODSNATIE, odsst.ODSACTI, odsst.ODSDIRE, odsst.ODSNOCL, odsst.ODSFREC, " +
					"bandeja_reporte.*, personal.persnomb, personal.persapel " +
					"from bandeja_reporte, odsst,personal " +
					"where bandeja_reporte.orden = odsst.ODSCODI " +
					" and bandeja_reporte.personal_reporte = personal.perscodi " +
					"and bandeja_reporte.bandeja = ? order by bandeja_reporte.fecha_reporte ";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setInt(1, bandeja);
			ResultSet rs = conexion.Query(pst);
			while (rs.next()) {
				OrdenBandeja orden = new OrdenBandeja();
				orden.setOrden(rs.getString("orden"));
				orden.setBandeja(rs.getInt("bandeja"));
				orden.setFecha_reporte(rs.getString("fecha_reporte"));
				orden.setUsuario_reporte(rs.getString("usuario_reporte"));
				orden.setId(rs.getInt("id"));
				orden.setPersonal_reporte(rs.getString("personal_reporte"));
				orden.setNombreTecnico(rs.getString("persnomb") + " " + rs.getString("persapel"));
				orden.setCliente(rs.getString("odsnocl"));
				orden.setProducto(rs.getString("odsacti"));
				orden.setPeticion(rs.getString("odsnatis") + "-" + rs.getString("odsnatie"));
				orden.setDireccion(rs.getString("odsdire"));
				orden.setFecha_orden(rs.getString("odsfrec"));
				orden.setTipo_orden(rs.getInt("tipo_orden"));
				lista.add(orden);
			}
		}
		
		if (b.getTipo() == GestionBandeja.ORDEN_INSTALACION) {  // Orden de instalacion
			String sql = "select odsvpi.ODSNATIS, odsvpi.ODSNATIE, odsvpi.ODSFAPS, odsvpi.ODSDIRE, odsvpi.ODSNOCL, odsvpi.ODSFERE, " +
					"bandeja_reporte.*, personal.persnomb, personal.persapel " +
					"from bandeja_reporte, odsvpi,personal " +
					"where bandeja_reporte.orden = odsvpi.ODSCODI " +
					" and bandeja_reporte.personal_reporte = personal.perscodi " +
					"and bandeja_reporte.bandeja = ? order by bandeja_reporte.fecha_reporte ";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setInt(1, bandeja);
			ResultSet rs = conexion.Query(pst);
			while (rs.next()) {
				OrdenBandeja orden = new OrdenBandeja();
				orden.setOrden(rs.getString("orden"));
				orden.setBandeja(rs.getInt("bandeja"));
				orden.setFecha_reporte(rs.getString("fecha_reporte"));
				orden.setUsuario_reporte(rs.getString("usuario_reporte"));
				orden.setId(rs.getInt("id"));
				orden.setPersonal_reporte(rs.getString("personal_reporte"));
				orden.setNombreTecnico(rs.getString("persnomb") + " " + rs.getString("persapel"));
				orden.setCliente(rs.getString("odsnocl"));
				orden.setProducto(rs.getString("odsfaps"));
				orden.setPeticion(rs.getString("odsnatis") + "-" + rs.getString("odsnatie"));
				orden.setDireccion(rs.getString("odsdire"));
				orden.setFecha_orden(rs.getString("odsfere"));
				orden.setTipo_orden(rs.getInt("tipo_orden"));
				lista.add(orden);
			}
		}
		
		
		
		return lista;
	}
	
	public boolean FindOrdenReporte(int id) throws SQLException {
		boolean result = false;
		String sql = "select * from bandeja_reporte where id=?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			this.ordenbandeja = new BandejaReporte();
			this.ordenbandeja.setBandeja(rs.getInt("bandeja"));
			this.ordenbandeja.setFecha_reporte(rs.getString("fecha_reporte"));
			this.ordenbandeja.setId(rs.getInt("id"));
			this.ordenbandeja.setOrden(rs.getString("orden"));
			this.ordenbandeja.setPersonal_reporte(rs.getString("personal_reporte"));
			this.ordenbandeja.setTipo_orden(rs.getInt("tipo_orden"));
			this.ordenbandeja.setUsuario_reporte(rs.getString("usuario_reporte"));
			
			result = true;
		}
		
		
		return result;
	}
	
	public boolean RemoveReporteBandeja(int id, int mode) throws SQLException {
		boolean result = false;
		String sql = "delete from bandeja_reporte where id=?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1,id);
		
		if (conexion.Update(pst) > 0) {
			if (mode == COMMIT_ON) {
				conexion.Commit();
			}
			result = true;
		}
		
		return result;
	}
	
	public boolean RemoveAllReporteBandeja(int tipo,int mode) throws SQLException {
		boolean result = false;
		String sql = "delete from bandeja_reporte where bandeja in (select id from bandejas where bandtipo = ?) ";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1,tipo);
		
		if (conexion.Update(pst) > 0) {
			if (mode == COMMIT_ON) {
				conexion.Commit();
			}
			result = true;
		}
		
		return result;
	}
	
	public ArrayList<OrdenBandeja> AllOrdenesUsuario(String usuario) throws SQLException {
		ArrayList<OrdenBandeja> lista = new ArrayList<OrdenBandeja>();
		String sql = "select odsst.ODSNATIS, odsst.ODSNATIE, odsst.ODSACTI, odsst.ODSDIRE, odsst.ODSNOCL,odsst.ODSFREC, " +
				"bandeja_reporte.*, personal.persnomb, personal.persapel " +
				"from bandeja_reporte, odsst,personal,bandeja_usuario " +
				"where bandeja_reporte.orden = odsst.ODSCODI " +
				" and bandeja_reporte.personal_reporte = personal.perscodi " +
				" and bandeja_reporte.bandeja = bandeja_usuario.bandeja " +
				" and bandeja_usuario.usuario = ? order by bandeja_reporte.fecha_reporte ";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, usuario);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			OrdenBandeja orden = new OrdenBandeja();
			orden.setOrden(rs.getString("orden"));
			orden.setBandeja(rs.getInt("bandeja"));
			orden.setFecha_reporte(rs.getString("fecha_reporte"));
			orden.setUsuario_reporte(rs.getString("usuario_reporte"));
			orden.setId(rs.getInt("id"));
			orden.setPersonal_reporte(rs.getString("personal_reporte"));
			orden.setNombreTecnico(rs.getString("persnomb") + " " + rs.getString("persapel"));
			orden.setCliente(rs.getString("odsnocl"));
			orden.setProducto(rs.getString("odsacti"));
			orden.setPeticion(rs.getString("odsnatis") + "-" + rs.getString("odsnatie"));
			orden.setDireccion(rs.getString("odsdire"));
			orden.setFecha_orden(rs.getString("odsfrec"));
			lista.add(orden);
		}
		
		return lista;
	}
	
	public ArrayList<OrdenBandeja> ListOrdenesBandeja(int tipo) throws SQLException {
		ArrayList<OrdenBandeja> lista = new ArrayList<OrdenBandeja>();
		String sql = "select odsst.ODSNATIS, odsst.ODSNATIE, odsst.ODSACTI, odsst.ODSDIRE, odsst.ODSNOCL,odsst.ODSFREC, " +
				"bandeja_reporte.*, personal.persnomb, personal.persapel " +
				"from bandeja_reporte, odsst,personal,bandejas " +
				"where bandeja_reporte.orden = odsst.ODSCODI " +
				" and bandeja_reporte.personal_reporte = personal.perscodi " +
				" and bandeja_reporte.bandeja = bandejas.id " +
				" and bandejas.bandtipo = ? order by bandeja_reporte.fecha_reporte ";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, tipo);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			OrdenBandeja orden = new OrdenBandeja();
			orden.setOrden(rs.getString("orden"));
			orden.setBandeja(rs.getInt("bandeja"));
			orden.setFecha_reporte(rs.getString("fecha_reporte"));
			orden.setUsuario_reporte(rs.getString("usuario_reporte"));
			orden.setId(rs.getInt("id"));
			orden.setPersonal_reporte(rs.getString("personal_reporte"));
			orden.setNombreTecnico(rs.getString("persnomb") + " " + rs.getString("persapel"));
			orden.setCliente(rs.getString("odsnocl"));
			orden.setProducto(rs.getString("odsacti"));
			orden.setPeticion(rs.getString("odsnatis") + "-" + rs.getString("odsnatie"));
			orden.setDireccion(rs.getString("odsdire"));
			orden.setFecha_orden(rs.getString("odsfrec"));
			lista.add(orden);
		}
		
		return lista;
	}
	public ArrayList<OrdenBandeja> ListOrdenesBandeja(int tipo, String departamento) throws SQLException {
		ArrayList<OrdenBandeja> lista = new ArrayList<OrdenBandeja>();
		String sql = "select odsst.ODSNATIS, odsst.ODSNATIE, odsst.ODSACTI, odsst.ODSDIRE, odsst.ODSNOCL,odsst.ODSFREC, " +
				"bandeja_reporte.*, personal.persnomb, personal.persapel " +
				"from bandeja_reporte, odsst,personal,bandejas " +
				"where bandeja_reporte.orden = odsst.ODSCODI " +
				" and bandeja_reporte.personal_reporte = personal.perscodi " +
				" and bandeja_reporte.bandeja = bandejas.id " +
				" and bandejas.bandtipo = ? " +
				" and bandeja_reporte.bandeja in (select bandeja from bandeja_departamento where departamento = ?)" +
				" order by bandeja_reporte.fecha_reporte";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, tipo);
		pst.setString(2, departamento);
		
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			OrdenBandeja orden = new OrdenBandeja();
			orden.setOrden(rs.getString("orden"));
			orden.setBandeja(rs.getInt("bandeja"));
			orden.setFecha_reporte(rs.getString("fecha_reporte"));
			orden.setUsuario_reporte(rs.getString("usuario_reporte"));
			orden.setId(rs.getInt("id"));
			orden.setPersonal_reporte(rs.getString("personal_reporte"));
			orden.setNombreTecnico(rs.getString("persnomb") + " " + rs.getString("persapel"));
			orden.setCliente(rs.getString("odsnocl"));
			orden.setProducto(rs.getString("odsacti"));
			orden.setPeticion(rs.getString("odsnatis") + "-" + rs.getString("odsnatie"));
			orden.setDireccion(rs.getString("odsdire"));
			orden.setFecha_orden(rs.getString("odsfrec"));
			lista.add(orden);
		}
		
		return lista;
	}
	
	public Long TotalOrdenesBandeja(int tipo) throws SQLException {
		Long total = 0L;
		String sql = "select count(bandeja_reporte.id) as total from bandeja_reporte,bandejas where bandeja_reporte.bandeja = bandejas.id and bandejas.bandtipo = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, tipo);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			total = rs.getLong("total");
		}
		rs.close();
		return total;
	}
	
	public Long TotalOrdenesBandejaReporte(int id) throws SQLException {
		Long total = 0L;
		String sql = "select count(bandeja_reporte.id) as total from bandeja_reporte,bandejas where bandeja_reporte.bandeja = bandejas.id and bandejas.id = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setInt(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			total = rs.getLong("total");
		}
		rs.close();
		return total;
	}
	
	public boolean TransferirOrdenesBandeja(int bandeja_origen, int bandeja_destino) throws SQLException {
		ArrayList<OrdenBandeja> lista = this.OrdenesBandeja(bandeja_origen);
		if (lista.size() > 0 ) {
			for (OrdenBandeja item : lista ) {
				BandejaReporte br = new BandejaReporte();
				
				br.setBandeja(bandeja_destino);
				br.setFecha_reporte(item.getFecha_reporte());
				br.setOrden(item.getOrden());
				br.setPersonal_reporte(item.getPersonal_reporte());
				br.setTipo_orden(item.getTipo_orden());
				br.setUsuario_reporte(item.getUsuario_reporte());
				
				if (this.RemoveReporteBandeja(item.getId(), COMMIT_OFF)) {
					if (this.AddReporte(br, COMMIT_OFF)) {
						String sql = "update odsst set odsband = ? where odscodi=?";
						java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
						pst.setInt(1, bandeja_destino);
						pst.setString(2, item.getOrden());
						if (!(conexion.Update(pst) > 0)) {
							throw new SQLException ("Error al cambiar la bandeja a la orden " + br.getOrden());
						}
					}else {
						throw new SQLException ("Error al agregar reporte  id=" + item.getId() + " a la bandeja destino");
					}
				}else {
					throw new SQLException ("Error al eliminar reporte id=" + item.getId());
				}
			}
		}else {
			throw new SQLException ("No hay ordenes para transferir en bandeja origen");
		}
		return true;
	}
	
	public boolean DistribuirOrdenesBandeja(int tipo, String departamento) throws SQLException {
		ArrayList<Bandeja> bandejas = this.ListBandejasActivas(tipo,departamento);
		
		if (bandejas.size() > 0) {
			
			ArrayList<OrdenBandeja> lista = this.ListOrdenesBandeja(tipo,departamento);
			if (lista.size() > 0) {

					int j=0; // Contador bandejas
					
					for (BandejaReporte br : lista) {
						
						Bandeja bandeja = bandejas.get(j);
						br.setBandeja(bandeja.getId());  // Cambiar bandeja
						
						if (this.RemoveReporteBandeja(br.getId(), COMMIT_OFF)) {
							if (this.AddReporte(br, COMMIT_OFF)) {
								String sql = "update odsst set odsband = ? where odscodi=?";
								java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
								pst.setInt(1,br.getBandeja());
								pst.setString(2, br.getOrden());
								if (!(conexion.Update(pst) > 0)) {
									throw new SQLException("Error al cambiar la bandeja de la orden " + br.getOrden());
								}
							}else {
								throw new SQLException("Error al agregar el reporte en la bandeja id=" + br.getId());
							}
							
							if (j < bandejas.size()) {
								j++;  // cambiamos a la siguiente bandeja
							}else {
								j=0;  // iniciamos con la primera bandeja
							}
						}else {
							throw new SQLException("Error al eliminar el reporte de la bandeja " + br.getId());
						}
					}
			}else {
				throw new SQLException("No hay ordenes pendientes de confirmar en las bandejas");
			}
		}else {
			throw new SQLException("No hay Bandejas activas");
		}
		
		
		return true;
	}

}
